{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "wHsFZo6akD8M",
        "outputId": "ad2dfb82-1745-4b95-cb4e-6e839c1f5d72"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Downloading https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz to cifar100/cifar-100-python.tar.gz\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "100%|██████████| 169001437/169001437 [00:02<00:00, 75144842.48it/s]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Extracting cifar100/cifar-100-python.tar.gz to cifar100\n",
            "Files already downloaded and verified\n"
          ]
        }
      ],
      "source": [
        "import torch\n",
        "import torchvision\n",
        "import torchvision.transforms as transforms\n",
        "\n",
        "transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])\n",
        "batch_size = 8\n",
        "train_dataset = torchvision.datasets.cifar.CIFAR100(root='cifar100', train=False, transform=transform, download=True)\n",
        "test_dataset = torchvision.datasets.cifar.CIFAR100(root='cifar100', train=False, transform=transform, download=True)\n",
        "train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=2)\n",
        "test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 147
        },
        "id": "VjkCK8NykPMb",
        "outputId": "a059791d-0629-4634-9dfa-5615889ddfa3"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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Pb/927/N2972tvFnWmve9ra38fTTT7+CR/bajw9/+MM8+uijvOENb+Dbv/3bee655wD47d/+bbz3F8b8TW96E08++eRuzP+M8eyzz3Lz5s0LY3twcMBb3/rWcWyffvppDg8P+Yt/8S+O73nb296G1pr3v//9D/2YX8vx3ve+l6tXr/KFX/iFfN/3fR/37t0bX9uN82cXp6enABwfHwOf3nzx9NNP85a3vIVr166N7/mGb/gGzs7O+P3f//2HePSvrXjxWA/xr//1v+by5cu8+c1v5kd/9EdZrVbja6/lsX5VGcvdvXuXGOOFgQS4du0af/iHf/gKHdVrP9761rfycz/3c3zhF34hN27c4Cd+4if4S3/pL/HBD36QmzdvUlUVh4eHF37n2rVr3Lx585U54M+RGMbv5e7n4bWbN29y9erVC69bazk+Pt6N/2cQb3/72/nmb/5mXv/61/PRj36Uf/AP/gHveMc7ePrppzHG7Mb5s4iUEj/4gz/IV3/1V/PmN78Z4NOaL27evPmy9/zw2i5eGi831gB/42/8DV73utfx6KOP8ru/+7v8vb/393jmmWf4D//hPwCv7bF+VSUfu/g/E+94xzvGf3/Jl3wJb33rW3nd617Hv//3/57JZPIKHtkudvG/J/76X//r47/f8pa38CVf8iW88Y1v5L3vfS9f93Vf9woe2Ws33vnOd/LBD37wAj5sF/9n4k8a621M0lve8hYeeeQRvu7rvo6PfvSjvPGNb3zYh/m/NV5VbZfLly9jjHkJcvrWrVtcv379FTqqz704PDzkz/25P8dHPvIRrl+/Tt/3nJycXHjPbsz/7DGM3592P1+/fv0lYOoQAvfv39+N/58h3vCGN3D58mU+8pGPALtx/kzj+7//+/nlX/5lfvVXf5XHH398/PmnM19cv379Ze/54bVdXIw/aaxfLt761rcCXLivX6tj/apKPqqq4iu+4it497vfPf4spcS73/1unnrqqVfwyD63YrFY8NGPfpRHHnmEr/iKr8A5d2HMn3nmGZ577rndmP8Z4/Wvfz3Xr1+/MLZnZ2e8//3vH8f2qaee4uTkhN/+7d8e3/Oe97yHlNI40eziM48XXniBe/fu8cgjjwC7cf50I+fM93//9/OLv/iLvOc97+H1r3/9hdc/nfniqaee4vd+7/cuJHu/8iu/wv7+Pl/0RV/0cE7kNRCfaqxfLn7nd34H4MJ9/Zod61ca8fri+Lf/9t/muq7zz/3cz+UPfehD+Xu+53vy4eHhBTTvLj6z+OEf/uH83ve+Nz/77LP5v//3/57f9ra35cuXL+fbt2/nnHP+3u/93vzkk0/m97znPfm3fuu38lNPPZWfeuqpV/ioXxtxfn6eP/CBD+QPfOADGcj/9J/+0/yBD3wgf/zjH8855/xTP/VT+fDwMP/SL/1S/t3f/d38Td/0Tfn1r399Xq/X42e8/e1vz1/2ZV+W3//+9+f3ve99+Qu+4Avyt33bt71Sp/SqjD9tnM/Pz/Pf/bt/Nz/99NP52Wefzf/tv/23/OVf/uX5C77gC3LbtuNn7Mb5U8f3fd/35YODg/ze974337hxY/xarVbjez7VfBFCyG9+85vz13/91+ff+Z3fyf/1v/7XfOXKlfyjP/qjr8QpvWrjU431Rz7ykfyP//E/zr/1W7+Vn3322fxLv/RL+Q1veEP+mq/5mvEzXstj/apLPnLO+V/8i3+Rn3zyyVxVVf6qr/qq/Bu/8Ruv9CG9puNbv/Vb8yOPPJKrqsqPPfZY/tZv/db8kY98ZHx9vV7nv/W3/lY+OjrK0+k0/7W/9tfyjRs3XsEjfu3Er/7qr2bgJV/f8R3fkXMWuu0//If/MF+7di3XdZ2/7uu+Lj/zzDMXPuPevXv5277t2/J8Ps/7+/v5b/7Nv5nPz89fgbN59cafNs6r1Sp//dd/fb5y5Up2zuXXve51+bu/+7tfsmHZjfOnjpcbYyD/7M/+7PieT2e++NjHPpbf8Y535Mlkki9fvpx/+Id/OHvvH/LZvLrjU431c889l7/ma74mHx8f57qu8+d//ufnH/mRH8mnp6cXPue1OtYq55wfXp1lF7vYxS52sYtd/P97vKowH7vYxS52sYtd7OJzP3bJxy52sYtd7GIXu3iosUs+drGLXexiF7vYxUONXfKxi13sYhe72MUuHmrsko9d7GIXu9jFLnbxUGOXfOxiF7vYxS52sYuHGrvkYxe72MUudrGLXTzU2CUfu9jFLnaxi13s4qHGLvnYxS52sYtd7GIXDzV2yccudrGLXexiF7t4qLFLPnaxi13sYhe72MVDjV3ysYtd7GIXu9jFLh5q/P8AtjaPxfY5F4QAAAAASUVORK5CYII=",
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "torch.Size([8])\n"
          ]
        }
      ],
      "source": [
        "import matplotlib.pyplot as plt\n",
        "import numpy as np\n",
        "\n",
        "# functions to show an image\n",
        "\n",
        "\n",
        "def imshow(img):\n",
        "    img = img / 2 + 0.5     # unnormalize\n",
        "    npimg = img.numpy()\n",
        "    plt.imshow(np.transpose(npimg, (1, 2, 0)))\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "# get some random training images\n",
        "dataiter = iter(train_loader)\n",
        "# images, labels = dataiter.next()\n",
        "images, labels = next(dataiter)\n",
        "\n",
        "# show images\n",
        "imshow(torchvision.utils.make_grid(images))\n",
        "# print labels\n",
        "print(labels.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "id": "1mY2iwmCkcpA"
      },
      "outputs": [],
      "source": [
        "import math\n",
        "\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "from torch.nn import init\n",
        "\n",
        "def conv3x3(in_planes, out_planes, stride=1):\n",
        "    \"3x3 convolution with padding\"\n",
        "    return nn.Conv2d(\n",
        "        in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False\n",
        "    )\n",
        "\n",
        "\n",
        "class BasicBlock(nn.Module):\n",
        "    expansion = 1\n",
        "\n",
        "    def __init__(\n",
        "        self, inplanes, planes, stride=1, downsample=None, use_triplet_attention=False\n",
        "    ):\n",
        "        super(BasicBlock, self).__init__()\n",
        "        self.conv1 = conv3x3(inplanes, planes, stride)\n",
        "        self.bn1 = nn.BatchNorm2d(planes)\n",
        "        self.relu = nn.ReLU(inplace=True)\n",
        "        self.conv2 = conv3x3(planes, planes)\n",
        "        self.bn2 = nn.BatchNorm2d(planes)\n",
        "        self.downsample = downsample\n",
        "        self.stride = stride\n",
        "\n",
        "        if use_triplet_attention:\n",
        "            self.triplet_attention = TripletAttention(planes, 16)\n",
        "        else:\n",
        "            self.triplet_attention = None\n",
        "\n",
        "    def forward(self, x):\n",
        "        residual = x\n",
        "\n",
        "        out = self.conv1(x)\n",
        "        out = self.bn1(out)\n",
        "        out = self.relu(out)\n",
        "\n",
        "        out = self.conv2(out)\n",
        "        out = self.bn2(out)\n",
        "\n",
        "        if self.downsample is not None:\n",
        "            residual = self.downsample(x)\n",
        "\n",
        "        if not self.triplet_attention is None:\n",
        "            out = self.triplet_attention(out)\n",
        "\n",
        "        out += residual\n",
        "        out = self.relu(out)\n",
        "\n",
        "        return out\n",
        "\n",
        "\n",
        "class Bottleneck(nn.Module):\n",
        "    expansion = 4\n",
        "\n",
        "    def __init__(\n",
        "        self, inplanes, planes, stride=1, downsample=None, use_triplet_attention=False\n",
        "    ):\n",
        "        super(Bottleneck, self).__init__()\n",
        "        self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)\n",
        "        self.bn1 = nn.BatchNorm2d(planes)\n",
        "        self.conv2 = nn.Conv2d(\n",
        "            planes, planes, kernel_size=3, stride=stride, padding=1, bias=False\n",
        "        )\n",
        "        self.bn2 = nn.BatchNorm2d(planes)\n",
        "        self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)\n",
        "        self.bn3 = nn.BatchNorm2d(planes * 4)\n",
        "        self.relu = nn.ReLU(inplace=True)\n",
        "        self.downsample = downsample\n",
        "        self.stride = stride\n",
        "\n",
        "        if use_triplet_attention:\n",
        "            self.triplet_attention = TripletAttention(planes * 4, 16)\n",
        "        else:\n",
        "            self.triplet_attention = None\n",
        "\n",
        "    def forward(self, x):\n",
        "        residual = x\n",
        "\n",
        "        out = self.conv1(x)\n",
        "        out = self.bn1(out)\n",
        "        out = self.relu(out)\n",
        "\n",
        "        out = self.conv2(out)\n",
        "        out = self.bn2(out)\n",
        "        out = self.relu(out)\n",
        "\n",
        "        out = self.conv3(out)\n",
        "        out = self.bn3(out)\n",
        "\n",
        "        if self.downsample is not None:\n",
        "            residual = self.downsample(x)\n",
        "\n",
        "        if not self.triplet_attention is None:\n",
        "            out = self.triplet_attention(out)\n",
        "\n",
        "        out += residual\n",
        "        out = self.relu(out)\n",
        "\n",
        "        return out\n",
        "\n",
        "\n",
        "class ResNet(nn.Module):\n",
        "    def __init__(self, block, layers, network_type, num_classes, att_type=None):\n",
        "        self.inplanes = 64\n",
        "        super(ResNet, self).__init__()\n",
        "        self.network_type = network_type\n",
        "        # different model config between ImageNet and CIFAR\n",
        "        if network_type == \"ImageNet\":\n",
        "            self.conv1 = nn.Conv2d(\n",
        "                3, 64, kernel_size=7, stride=2, padding=3, bias=False\n",
        "            )\n",
        "            self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)\n",
        "            self.avgpool = nn.AvgPool2d(7)\n",
        "        else:\n",
        "            self.conv1 = nn.Conv2d(\n",
        "                3, 64, kernel_size=3, stride=1, padding=1, bias=False\n",
        "            )\n",
        "\n",
        "        self.bn1 = nn.BatchNorm2d(64)\n",
        "        self.relu = nn.ReLU(inplace=True)\n",
        "\n",
        "        self.layer1 = self._make_layer(block, 64, layers[0], att_type=att_type)\n",
        "        self.layer2 = self._make_layer(\n",
        "            block, 128, layers[1], stride=2, att_type=att_type\n",
        "        )\n",
        "        self.layer3 = self._make_layer(\n",
        "            block, 256, layers[2], stride=2, att_type=att_type\n",
        "        )\n",
        "        self.layer4 = self._make_layer(\n",
        "            block, 512, layers[3], stride=2, att_type=att_type\n",
        "        )\n",
        "\n",
        "        self.fc = nn.Linear(512 * block.expansion, num_classes)\n",
        "\n",
        "        init.kaiming_normal_(self.fc.weight)\n",
        "        for key in self.state_dict():\n",
        "            if key.split(\".\")[-1] == \"weight\":\n",
        "                if \"conv\" in key:\n",
        "                    init.kaiming_normal_(self.state_dict()[key], mode=\"fan_out\")\n",
        "                if \"bn\" in key:\n",
        "                    if \"SpatialGate\" in key:\n",
        "                        self.state_dict()[key][...] = 0\n",
        "                    else:\n",
        "                        self.state_dict()[key][...] = 1\n",
        "            elif key.split(\".\")[-1] == \"bias\":\n",
        "                self.state_dict()[key][...] = 0\n",
        "\n",
        "    def _make_layer(self, block, planes, blocks, stride=1, att_type=None):\n",
        "        downsample = None\n",
        "        if stride != 1 or self.inplanes != planes * block.expansion:\n",
        "            downsample = nn.Sequential(\n",
        "                nn.Conv2d(\n",
        "                    self.inplanes,\n",
        "                    planes * block.expansion,\n",
        "                    kernel_size=1,\n",
        "                    stride=stride,\n",
        "                    bias=False,\n",
        "                ),\n",
        "                nn.BatchNorm2d(planes * block.expansion),\n",
        "            )\n",
        "\n",
        "        layers = []\n",
        "        layers.append(\n",
        "            block(\n",
        "                self.inplanes,\n",
        "                planes,\n",
        "                stride,\n",
        "                downsample,\n",
        "                use_triplet_attention=att_type == \"TripletAttention\",\n",
        "            )\n",
        "        )\n",
        "        self.inplanes = planes * block.expansion\n",
        "        for i in range(1, blocks):\n",
        "            layers.append(\n",
        "                block(\n",
        "                    self.inplanes,\n",
        "                    planes,\n",
        "                    use_triplet_attention=att_type == \"TripletAttention\",\n",
        "                )\n",
        "            )\n",
        "\n",
        "        return nn.Sequential(*layers)\n",
        "\n",
        "    def forward(self, x):\n",
        "        x = self.conv1(x)\n",
        "        x = self.bn1(x)\n",
        "        x = self.relu(x)\n",
        "        if self.network_type == \"ImageNet\":\n",
        "            x = self.maxpool(x)\n",
        "\n",
        "        x = self.layer1(x)\n",
        "        x = self.layer2(x)\n",
        "        x = self.layer3(x)\n",
        "        x = self.layer4(x)\n",
        "\n",
        "        if self.network_type == \"ImageNet\":\n",
        "            x = self.avgpool(x)\n",
        "        else:\n",
        "            x = F.avg_pool2d(x, 4)\n",
        "        x = x.view(x.size(0), -1)\n",
        "        x = self.fc(x)\n",
        "        return x\n",
        "\n",
        "\n",
        "def ResidualNet(network_type, depth, num_classes, att_type):\n",
        "\n",
        "    assert network_type in [\n",
        "        \"ImageNet\",\n",
        "        \"CIFAR10\",\n",
        "        \"CIFAR100\",\n",
        "    ], \"network type should be ImageNet or CIFAR10 / CIFAR100\"\n",
        "    assert depth in [18, 34, 50, 101], \"network depth should be 18, 34, 50 or 101\"\n",
        "\n",
        "    if depth == 18:\n",
        "        model = ResNet(BasicBlock, [2, 2, 2, 2], network_type, num_classes, att_type)\n",
        "\n",
        "    elif depth == 34:\n",
        "        model = ResNet(BasicBlock, [3, 4, 6, 3], network_type, num_classes, att_type)\n",
        "\n",
        "    elif depth == 50:\n",
        "        model = ResNet(Bottleneck, [3, 4, 6, 3], network_type, num_classes, att_type)\n",
        "\n",
        "    elif depth == 101:\n",
        "        model = ResNet(Bottleneck, [3, 4, 23, 3], network_type, num_classes, att_type)\n",
        "\n",
        "    return model"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "otA9CIgdnXfW",
        "outputId": "cc48fb07-5d0f-4446-9244-8b2052ef8020"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "ResNet(\n",
            "  (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "  (relu): ReLU(inplace=True)\n",
            "  (layer1): Sequential(\n",
            "    (0): Bottleneck(\n",
            "      (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "      (downsample): Sequential(\n",
            "        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      )\n",
            "    )\n",
            "    (1): Bottleneck(\n",
            "      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "    (2): Bottleneck(\n",
            "      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "  )\n",
            "  (layer2): Sequential(\n",
            "    (0): Bottleneck(\n",
            "      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "      (downsample): Sequential(\n",
            "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
            "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      )\n",
            "    )\n",
            "    (1): Bottleneck(\n",
            "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "    (2): Bottleneck(\n",
            "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "    (3): Bottleneck(\n",
            "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "  )\n",
            "  (layer3): Sequential(\n",
            "    (0): Bottleneck(\n",
            "      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "      (downsample): Sequential(\n",
            "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
            "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      )\n",
            "    )\n",
            "    (1): Bottleneck(\n",
            "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "    (2): Bottleneck(\n",
            "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "    (3): Bottleneck(\n",
            "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "    (4): Bottleneck(\n",
            "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "    (5): Bottleneck(\n",
            "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "  )\n",
            "  (layer4): Sequential(\n",
            "    (0): Bottleneck(\n",
            "      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "      (downsample): Sequential(\n",
            "        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
            "        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      )\n",
            "    )\n",
            "    (1): Bottleneck(\n",
            "      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "    (2): Bottleneck(\n",
            "      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
            "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
            "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
            "      (relu): ReLU(inplace=True)\n",
            "    )\n",
            "  )\n",
            "  (fc): Linear(in_features=2048, out_features=100, bias=True)\n",
            ")\n"
          ]
        }
      ],
      "source": [
        "device=\"cuda\"\n",
        "net=ResidualNet(\"CIFAR100\",50,100,None).to(device)\n",
        "print(net)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "35VI01P_kqal",
        "outputId": "e9a6a4ce-3d52-4e8d-b58a-f7727f7c745b"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "1250\n"
          ]
        }
      ],
      "source": [
        "import torch.optim as optim\n",
        "\n",
        "criterion = nn.CrossEntropyLoss()\n",
        "optimizer = torch.optim.Adam(net.parameters(), lr=0.0005)\n",
        "print(len(train_loader))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ck0do7nrmNTQ"
      },
      "outputs": [],
      "source": []
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "metadata": {
        "id": "xKlx2mCxlE02"
      },
      "outputs": [],
      "source": [
        "from tqdm import tqdm\n",
        "def train(epoch):\n",
        "    net.train()\n",
        "    # Loop over each batch from the training set\n",
        "    train_tqdm = tqdm(train_loader, desc=\"Epoch \" + str(epoch))\n",
        "    for batch_idx, (data, target) in enumerate(train_tqdm):\n",
        "        # Copy data to GPU if needed\n",
        "        data = data.to(device)\n",
        "        target = target.to(device)\n",
        "        # Zero gradient buffers\n",
        "        optimizer.zero_grad()\n",
        "        # Pass data through the network\n",
        "        output = net(data)\n",
        "        # Calculate loss\n",
        "        loss = criterion(output, target)\n",
        "        # Backpropagate\n",
        "        loss.backward()\n",
        "        # Update weights\n",
        "        optimizer.step()  # w - alpha * dL / dw\n",
        "        train_tqdm.set_postfix({\"loss\": \"%.3g\" % loss.item()})\n",
        "\n",
        "def validate(lossv,top1AccuracyList,top5AccuracyList):\n",
        "    net.eval()\n",
        "    val_loss = 0\n",
        "    top1Correct = 0\n",
        "    top5Correct = 0\n",
        "    for index,(data, target) in enumerate(test_loader):\n",
        "        data = data.to(device)\n",
        "        labels = target.to(device)\n",
        "        outputs = net(data)\n",
        "        val_loss += criterion(outputs, labels).data.item()\n",
        "        _, top1Predicted = torch.max(outputs.data, 1)\n",
        "        top5Predicted = torch.topk(outputs.data, k=5, dim=1, largest=True)[1]\n",
        "        top1Correct += (top1Predicted == labels).cpu().sum().item()\n",
        "        label_resize = labels.view(-1, 1).expand_as(top5Predicted)\n",
        "        top5Correct += torch.eq(top5Predicted, label_resize).view(-1).cpu().sum().float().item()\n",
        "\n",
        "    val_loss /= len(test_loader)\n",
        "    lossv.append(val_loss)\n",
        "\n",
        "    top1Acc=100*top1Correct / len(test_loader.dataset)\n",
        "    top5Acc=100*top5Correct / len(test_loader.dataset)\n",
        "    top1AccuracyList.append(top1Acc)\n",
        "    top5AccuracyList.append(top5Acc)\n",
        "    \n",
        "    print('\\nValidation set: Average loss: {:.4f}, Top1Accuracy: {}/{} ({:.0f}%) Top5Accuracy: {}/{} ({:.0f}%)\\n'.format(\n",
        "        val_loss, top1Correct, len(test_loader.dataset), top1Acc,top5Correct, len(test_loader.dataset), top5Acc))\n",
        "#     accuracy = 100. * correct.to(torch.float32) / len(testloader.dataset)\n",
        "#     accv.append(accuracy)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 24,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "pTWz8B3Dl9gu",
        "outputId": "7aed78c3-6ee9-4b39-d339-02b00a81db23"
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 0: 100%|██████████| 1250/1250 [01:01<00:00, 20.40it/s, loss=3.5]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 3.9302, Top1Accuracy: 1524/10000 (15%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 1: 100%|██████████| 1250/1250 [01:00<00:00, 20.73it/s, loss=3.56]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 3.3869, Top1Accuracy: 2037/10000 (20%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 2: 100%|██████████| 1250/1250 [00:59<00:00, 21.02it/s, loss=4.38]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 3.4460, Top1Accuracy: 2385/10000 (24%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 3: 100%|██████████| 1250/1250 [00:59<00:00, 21.09it/s, loss=3.59]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 3.4086, Top1Accuracy: 3150/10000 (32%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 4: 100%|██████████| 1250/1250 [00:59<00:00, 21.09it/s, loss=2.55]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 2.8426, Top1Accuracy: 3774/10000 (38%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 5: 100%|██████████| 1250/1250 [00:59<00:00, 21.10it/s, loss=2.49]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 2.0139, Top1Accuracy: 4635/10000 (46%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 6: 100%|██████████| 1250/1250 [00:59<00:00, 20.86it/s, loss=1.71]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 1.7836, Top1Accuracy: 5815/10000 (58%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 7: 100%|██████████| 1250/1250 [00:59<00:00, 21.01it/s, loss=2.27]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 1.1386, Top1Accuracy: 6974/10000 (70%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 8: 100%|██████████| 1250/1250 [00:59<00:00, 20.98it/s, loss=1.03]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.7287, Top1Accuracy: 7852/10000 (79%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 9: 100%|██████████| 1250/1250 [00:59<00:00, 20.91it/s, loss=0.631]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.3916, Top1Accuracy: 8846/10000 (88%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 10: 100%|██████████| 1250/1250 [00:59<00:00, 20.97it/s, loss=1.5]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.2189, Top1Accuracy: 9352/10000 (94%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 11: 100%|██████████| 1250/1250 [00:59<00:00, 20.99it/s, loss=0.853]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.2159, Top1Accuracy: 9339/10000 (93%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 12: 100%|██████████| 1250/1250 [01:01<00:00, 20.41it/s, loss=0.104]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.1723, Top1Accuracy: 9501/10000 (95%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 13: 100%|██████████| 1250/1250 [00:59<00:00, 20.87it/s, loss=0.024]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.1370, Top1Accuracy: 9603/10000 (96%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 14: 100%|██████████| 1250/1250 [00:59<00:00, 20.85it/s, loss=0.463]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.0934, Top1Accuracy: 9717/10000 (97%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 15: 100%|██████████| 1250/1250 [00:59<00:00, 20.94it/s, loss=0.0892]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.0659, Top1Accuracy: 9820/10000 (98%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 16: 100%|██████████| 1250/1250 [00:59<00:00, 20.97it/s, loss=0.133]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.1302, Top1Accuracy: 9614/10000 (96%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 17: 100%|██████████| 1250/1250 [00:59<00:00, 21.03it/s, loss=0.0862]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.0783, Top1Accuracy: 9803/10000 (98%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 18: 100%|██████████| 1250/1250 [00:59<00:00, 21.00it/s, loss=0.204]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.0775, Top1Accuracy: 9767/10000 (98%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Epoch 19: 100%|██████████| 1250/1250 [01:00<00:00, 20.77it/s, loss=0.00531]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 0.0517, Top1Accuracy: 9868/10000 (99%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n",
            "Finished Training\n"
          ]
        }
      ],
      "source": [
        "lossv = []\n",
        "top1AccuracyList = []   # top1准确率列表\n",
        "top5AccuracyList = []   # top5准确率列表\n",
        "max_epoch = 20\n",
        "for epoch in range(max_epoch):  # loop over the dataset multiple times\n",
        "    train(epoch)\n",
        "    with torch.no_grad():\n",
        "        validate(lossv,top1AccuracyList,top5AccuracyList)\n",
        "        \n",
        "print('Finished Training')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "5qEPmaZO1NU3"
      },
      "outputs": [],
      "source": []
    },
    {
      "cell_type": "code",
      "execution_count": 23,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Z1-D3LkhvzDq",
        "outputId": "e29901ea-e0b2-4141-f18e-a6431171ec0f"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Validation set: Average loss: 4.5184, Top1Accuracy: 943/10000 (9%) Top5Accuracy: 0.0/10000 (0%)\n",
            "\n"
          ]
        }
      ],
      "source": [
        "# 绘制曲线\n",
        "plt.figure(figsize=(5,3))\n",
        "plt.plot(np.arange(1,len(lossv)), lossv)\n",
        "plt.title('validation loss')\n",
        "\n",
        "plt.figure(figsize=(5,3))\n",
        "plt.plot(np.arange(1,len(top1AccuracyList)), top1AccuracyList)\n",
        "plt.title('validation top1 accuracy')\n",
        "\n",
        "plt.figure(figsize=(5,3))\n",
        "plt.plot(np.arange(1,len(top5AccuracyList)), top5AccuracyList)\n",
        "plt.title('validation top5 accuracy')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "fyWGvlbHup5w"
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "gpuType": "T4",
      "provenance": []
    },
    "gpuClass": "standard",
    "kernelspec": {
      "display_name": "Python 3.10.3 64-bit",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.10.3"
    },
    "vscode": {
      "interpreter": {
        "hash": "6ad33e096e05aa34a53a020c7212c2ebeaad0c283eb3c6a43a9b0f5ae37d0a4a"
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
